/**
 *
 */
package com.cmcc.pcap.packet.sctp;

import com.cmcc.pcap.packet.tcp.TcpPacketDecorator;
import com.cmcc.pcap.packet.tcp.TcpProtocol;
import com.cmcc.pcap.packet.util.PacketAnalysisConfig;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.pcap4j.packet.SctpPacket;
import org.pcap4j.packet.UnknownSctpChunk;
import org.pcap4j.packet.namednumber.SctpChunkType;

import java.util.Arrays;

/**
 * @Date 2018年3月21日 上午11:01:51
 * @author Amish
 * 用于判断应用层协议类型，并根据配置决定是否返回对应的协议类型，供调用类决定是否继续处理等
 * 在分段情况下，一般只有第一个数据包能判断应用层协议类型
 */
public class SctpProtocolFilter {

	public static Logger logger = LogManager.getLogger(SctpProtocolFilter.class);


	
	/**
	 * 如果是需要处理的应用层协议，直接返回协议名称，如SctpProtocol.SCTP
	 * 如果是需要过滤掉的应用层协议，返回TcpProtocol.NOTDEAL
	 * 如没有应用层数据的包，返回null
	 * 如果是无法判断的应用层协议（包括分段后续包），返回null
	 * @param sctpPacketDecorator
	 * @return
	 */
	public static SctpProtocol filterSctpProtocol(SctpPacketDecorator sctpPacketDecorator){
		
		if(sctpPacketDecorator.sctpPacket.getHeader().getChunks().size() == 0){
			return null;
		}

		String dst_port = sctpPacketDecorator.sctpPacket.getHeader().getDstPort().valueAsString();
		String src_port = sctpPacketDecorator.sctpPacket.getHeader().getSrcPort().valueAsString();

		if(dst_port.equals("38412") || src_port.equals("38412")){
				logger.debug("NGAP filtered");
				return SctpProtocol.NGAP;
		}

		logger.debug("SCTP filtered");
		return SctpProtocol.SCTP;


	}

}